/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clases;

import java.text.SimpleDateFormat;
import java.util.regex.Pattern;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

/**
 *
 * @author Fernando Sahmkow
 */
public class Usuario extends Root {

    private String cedula;
    private String nombres;
    private String apellidos;
    private String sexo;
    private String correo;
    private String direccion;
    private String fechaNacimiento;
    private String telefonoCasa;
    private String telefonoCelular;
    private String nacionalidad;

    public Usuario() {
    }

    public Usuario(String cedula, String nombres, String apellidos, String sexo,
            String correo, String telefonoCasa, String telefonoCelular, String direccion,
            String fechaNacimiento, String nacionalidad) {
        this.cedula = cedula;
        this.nombres = nombres;
        this.apellidos = apellidos;
        this.sexo = sexo;
        this.correo = correo;
        this.telefonoCasa = telefonoCasa;
        this.telefonoCelular = telefonoCelular;
        this.direccion = direccion;
        this.nacionalidad = nacionalidad;
        this.fechaNacimiento = fechaNacimiento;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getCedula() {
        return cedula;
    }

    public void setCedula(String cedula) {
        this.cedula = cedula;
    }

    public String getCorreo() {
        return correo;
    }

    public void setCorreo(String correo) {
        this.correo = correo;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(String fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public String getTelefonoCasa() {
        return telefonoCasa;
    }

    public void setTelefonoCasa(String telefonoCasa) {
        this.telefonoCasa = telefonoCasa;
    }

    public String getTelefonoCelular() {
        return telefonoCelular;
    }

    public void setTelefonoCelular(String telefonoCelular) {
        this.telefonoCelular = telefonoCelular;
    }

    public void cleanAttributes() {
        setCedula("");
        setNombres("");
        setApellidos("");
        setCorreo("");
        setDireccion("");
        setFechaNacimiento("");
        setNacionalidad("");
        setSexo("");
        setTelefonoCasa("");
        setTelefonoCelular("");

    }

    public String getNacionalidad() {
        return this.nacionalidad;
    }

    public void setNacionalidad(String a) {
        this.nacionalidad = a;
    }

    public String consultar() {
        String s = (this.cedula != null && !cedula.isEmpty() ? "cedula = \'" + this.cedula + "\' " : "");
        s += (this.apellidos != null && !apellidos.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " apellidos  =\'" + this.apellidos + "\' " : "");
        s += (this.nombres != null && !nombres.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " nombres  =\'" + this.nombres + "\' " : "");
        s += (this.correo != null && !correo.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " correo  = \'" + this.correo + "\' " : "");
        s += (this.sexo != null && !sexo.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " sexo  = \'" + this.sexo + "\' " : "");
        s += (this.telefonoCasa != null && !telefonoCasa.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " telefonocasa  =\'" + this.telefonoCasa + "\' " : "");
        s += (this.telefonoCelular != null && !telefonoCelular.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " telefonocelular =\'" + this.telefonoCelular + "\' " : "");
        s += (this.direccion != null && !direccion.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " direccion  =\'" + this.direccion + "\' " : "");
        s += (this.fechaNacimiento != null && !fechaNacimiento.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " fechanacimiento  =\'" + this.fechaNacimiento + "\' " : "");
        s += (this.nacionalidad != null && !nacionalidad.isEmpty() ? (s.isEmpty() ? "" : "AND ") + " nacionalidad  =\'" + this.nacionalidad + "\' " : "");
        return s;
    }

    public boolean equals(Usuario u) {
        return this.cedula.equals(u.getCedula());
    }

//    @Override
//    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){
//        ActionErrors errors = new ActionErrors();
//        if(cedula == null || cedula.isEmpty()){
//            errors.add("cedula", new ActionMessage("errors.cedula.vacia"));
//        }else if(!cedula.matches("[0-9]+")){
//            errors.add("cedula", new ActionMessage("errors.cedula.noNumeros"));
//        }        
//        return errors;        
//    }
    /**
     * Método que verifica que todos los atributos contenidos en 'this' cumplen
     * con el formato especificado, en caso de que se encuentren presentes
     * 
     * @return true en caso que todos los atributos sean válidos,
     *                   false en caso contrario
     */
    public boolean hasValidAtts() {
        System.out.println("Se llamo al metodo hasValidAtts en Usuario");
        // Espacios al principio o al final no deberian tomarse en cuenta para la validacion
        this.fechaNacimiento = (this.fechaNacimiento != null ? this.fechaNacimiento.trim() : null);
        this.cedula = (this.cedula != null ? this.cedula.trim() : null);
        this.apellidos = (this.apellidos != null ? this.apellidos.trim() : null);
        this.correo = (this.correo != null ? this.correo.trim() : null);
        this.nombres = (this.nombres != null ? this.nombres.trim() : null);
        this.telefonoCasa = (this.telefonoCasa != null ? this.telefonoCasa.trim() : null);
        this.telefonoCelular = (this.telefonoCelular != null ? this.telefonoCelular.trim() : null);
        
        //Primero se usa el lenguaje para checkear si la fecha es alida
        if (this.fechaNacimiento != null && !this.fechaNacimiento.isEmpty()) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

            //Esta variable contendrá la fecha a validar
            Date testDate = null;

            //Ahora intentamos parsear la fecha de nacimiento en un objeto de tipo Date
            //Si la fecha no está en el formato correcto, se generará una excepción
            try {
                testDate = sdf.parse(this.fechaNacimiento);
            } catch (ParseException e) {
                return false;
            }
            //Ahora validamos que la fecha dada sea igual a la que se guardó
        /* El método format desplazará las fechas si los números son inválidos.
             * Por ende, la fecha 32/12/2011 se convertirá en 01/11/2012. Así,
             * al comparar, el resultado de format debe ser igual a la fecha dada.
             */
            if (!sdf.format(testDate).equals(this.fechaNacimiento)) {
                return false;
            }
        }
        // Pregunto por cada atributo por separado para poder identificar donde esta el error
        if (this.cedula == null || !Pattern.matches("^\\d+$", this.cedula)) {
            System.out.println("cedula invalida");
        } else if (!(null == this.nombres || Pattern.matches("^[a-zA-Záóéíúñ]* ?[a-zA-Záóéíúñ]*$", this.nombres))) {
            System.out.println("nombres invalidos");
        } else if (!(null == this.apellidos || Pattern.matches("^[a-zA-Záóéíúñ]* ?[a-zA-Záóéíúñ]*$", this.apellidos))) {
            System.out.println("apellidos invalidos");
        } else if (!(null == this.sexo || this.sexo.isEmpty() || Pattern.matches("M|F|m|f", this.sexo))) {
            System.out.println("sexo invalidos");
        } else if (!(null == this.correo || this.correo.isEmpty() || Pattern.matches("^[\\w\\-]+@[\\w\\-\\d]+(?:\\.[\\w\\-\\d]+)+$", this.correo))) {
            System.out.println("correo invalidos");
        } else if (!(null == this.direccion || this.direccion.isEmpty() || Pattern.matches("^(.|\\s)+$", this.direccion))) {
            System.out.println("direccion invalidos");
        } else if (!(null == this.telefonoCasa || this.telefonoCasa.isEmpty() || Pattern.matches("^\\d{7,12}$", this.telefonoCasa))) {
            System.out.println("telefonoCasa invalidos");
        } else if (!(null == this.telefonoCelular || this.telefonoCelular.isEmpty() || Pattern.matches("^\\d{7,12}$", this.telefonoCelular))) {
            System.out.println("telefonoCelular invalidos");
        } else if (!(null == this.nacionalidad || this.nacionalidad.isEmpty() || Pattern.matches("^V|E|v|e$", this.nacionalidad))) {
            System.out.println("nacionalidad invalidos");
        } else {
            return true;
        }
        return false;

    }

    private static boolean isNumeric(String cadena) {
        try {
            Integer.parseInt(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }

    public void cloneWith(Usuario u) {
        this.setApellidos(u.getApellidos());
        this.setNombres(u.getNombres());
        this.setCedula(u.getCedula());
        this.setCorreo(u.getCorreo());
        this.setDireccion(u.getDireccion());
        this.setFechaNacimiento(u.getFechaNacimiento());
        this.setNacionalidad(u.getNacionalidad());
        this.setSexo(u.getSexo());
        this.setTelefonoCasa(u.getTelefonoCasa());
        this.setTelefonoCelular(u.getTelefonoCelular());
    }
}
